package com.one.group.admin.mapper;
import com.mybatisflex.core.BaseMapper;
import com.one.group.model.dto.ParkingSpaceQueryDto;
import com.one.group.model.entity.ParkingSpace;
import com.one.group.model.entity.ParkingSpaceCharge;
import com.one.group.model.entity.VehicleSpace;
import com.one.group.model.vo.ParkingSpaceDetailVo;
import com.one.group.model.vo.ParkingSpaceListVo;
import com.one.group.model.vo.ParkingSpaceSearchVo;
import org.apache.ibatis.annotations.MapKey;

import java.util.List;
import java.util.Map;

public interface ParkingSpaceMapper extends BaseMapper<ParkingSpace> {
    List<ParkingSpaceListVo> findParkingSpaceByQueryDto(ParkingSpaceQueryDto parkingSpaceQueryDto);
    
    /**
     * 根据车位编号和小区ID查询车位
     * @param spaceNo 车位编号
     * @param cellId 小区ID
     * @param tenantId 租户ID
     * @return 车位信息
     */
    ParkingSpace selectOneBySpaceNoAndCellId(String spaceNo, Long cellId, Long tenantId);
    
    /**
     * 检查车位是否有车辆绑定
     * @param parkingSpaceId 车位ID
     * @return 是否有绑定
     */
    boolean hasVehicleBinding(Long parkingSpaceId);
    
    /**
     * 检查车位是否有收费标准绑定
     * @param parkingSpaceId 车位ID
     * @return 是否有绑定
     */
    boolean hasChargeBinding(Long parkingSpaceId);

    /**
     * 查询车位详情
     * @param id 车位ID
     * @param tenantId 租户ID
     * @return 车位详情
     */
    ParkingSpaceDetailVo getParkingSpaceDetail(Long id, Long tenantId);

    /**
     * 插入车位收费标准绑定记录
     * @param parkingSpaceCharge 绑定记录
     * @return 插入结果
     */
    int insertParkingSpaceCharge(ParkingSpaceCharge parkingSpaceCharge);


    /**
     * 删除车位收费标准绑定记录
     * @param parkingSpaceId 车位ID
     * @param chargeStandardId 收费标准ID
     * @param tenantId 租户ID
     * @return 删除结果
     */
    int deleteParkingSpaceCharge(Long parkingSpaceId, Long chargeStandardId, Long tenantId);

    /**
     * 根据小区名称查询小区ID
     * @param cellName 小区名称
     * @param tenantId 租户ID
     * @return 小区ID
     */
    Long getCellIdByName(String cellName, Long tenantId);

    /**
     * 根据租户ID查询所有小区信息
     * @param tenantId 租户ID
     * @return 小区信息列表
     */
    @MapKey("cell_id")
    List<Map<String, Object>> getAllCellsByTenantId(Long tenantId);

    /**
     * 根据车位编号模糊搜索车位
     * @param spaceNo 车位编号（支持模糊搜索）
     * @param cellId 小区ID
     * @param tenantId 租户ID
     * @return 车位搜索结果列表
     */
    List<ParkingSpaceSearchVo> searchParkingSpacesBySpaceNo(String spaceNo, Long cellId, Long tenantId);


    /**
     * 更新车辆车位绑定状态
     * @param id 绑定记录ID
     * @param status 新状态
     * @param tenantId 租户ID
     * @return 更新结果
     */
    int updateVehicleSpaceStatus(Long id, Integer status, Long tenantId);

    /**
     * 根据ID查询车辆车位绑定状态
     * @param id 绑定记录ID
     * @param tenantId 租户ID
     * @return 绑定状态
     */
    int getStatusById(Long id, Long tenantId);

    /**
     * 根据ID查询车辆车位绑定类型
     * @param id 绑定记录ID
     * @param tenantId 租户ID
     * @return 绑定类型
     */
    int getTypeById(Long id, Long tenantId);

    /**
     * 添加车辆车位绑定的业主ID
     * @param id 车位id
     * @param ownerId 业主ID
     * @param tenantId 租户ID
     * @return 添加结果
     */
    int addOwnerIdById(Long id, Long ownerId, Long tenantId);

    /**
     * 更新车位状态
     * @param id 车位ID
     * @param status 新状态
     * @return 更新结果
     */
    int updateStatus(Long id, Integer status, Long tenantId);

    /**
     * 根据ID查询车位绑定的业主ID
     * @param id 车位ID
     * @return 业主ID
     */
    Long getOwnerIdById(Long id, Long tenantId);
}
